In [1]:
# necessary imports
import pandas as pd
import numpy as np
from tqdm.notebook import tqdm
import ast
import warnings
warnings.filterwarnings('ignore')
import plotly.express as px
from plotly.subplots import make_subplots
import plotly.graph_objects as go
from gensim.test.utils import datapath
import sys
sys.path.append('../scripts/')
from lda import create_documents, run_ldas, get_topicwords_scores, get_tweet_topic
In [2]:
# read lda_tweets
df = pd.read_json('../../data/BTW17_Twitter/lda/preprocessed_lda_tweets.json')
df['username'] = df['user'].apply(lambda x: x.get('screen_name'))
df.head(3)
Out[2]:
created_at text user extended_tweet retweeted_status tags full_text full_text_processed tokens username
0 2017-08-02 RT @AfD_Bund: 6️⃣5️⃣.0️⃣0️⃣0️⃣ Follower auf #T... {'id': 738771661915344897, 'id_str': '73877166... 0 {'created_at': 'Wed Aug 02 21:28:47 +0000 2017... btw17 6️⃣5️⃣.0️⃣0️⃣0️⃣ Follower auf #Twitter!\nDie #... ️⃣️⃣.️⃣️⃣️⃣ Follower auf #Twitter!\nDie #AfD-P... [follower, twitter, finden, immer, mehr, anklang] AfD_HD
1 2017-08-02 RT @FraukePetry: #OSZE nimmt Sorge der #AfD er... {'id': 855324133, 'id_str': '855324133', 'name... 0 {'created_at': 'Wed Aug 02 11:37:33 +0000 2017... btw17 #OSZE nimmt Sorge der #AfD ernst und schickt T... #OSZE nimmt Sorge der #AfD ernst und schickt T... [osze, nehmen, sorge, afd, ernst, schicken, te... 83Schildi
2 2017-08-02 RT @AfD_Bund: 6️⃣5️⃣.0️⃣0️⃣0️⃣ Follower auf #T... {'id': 1305881724, 'id_str': '1305881724', 'na... 0 {'created_at': 'Wed Aug 02 21:28:47 +0000 2017... btw17 6️⃣5️⃣.0️⃣0️⃣0️⃣ Follower auf #Twitter!\nDie #... ️⃣️⃣.️⃣️⃣️⃣ Follower auf #Twitter!\nDie #AfD-P... [follower, twitter, finden, immer, mehr, anklang] helmut_hedrich
In [3]:
# join tweets from same author and same hashtag to one document
documents = create_documents(df)
In [4]:
# run lda for different num_topics
model_list, coherence_scores = run_ldas(documents, 50, 100)
coherence_scores['Coherence Score'] = coherence_scores.pop('c_v')
coherence_scores['Anzahl Topics'] = coherence_scores.pop('num_topics')
In [5]:
x, y = run_ldas(documents, 200, 201)
print(y)
{'num_topics': [200, 201], 'c_v': [0.8044460718847263, 0.8044460718847263]}

Coherence alleine funktioniert nicht, siehe Experimente mit 200 und 201 Topics. Dementsprechend wird dies angereichert mit der Anzahl einzigartiger Topics.

In [6]:
n_topics = []

for model in model_list:
    ntopics = []
    for idx, topic in model.print_topics(-1):
        ntopics.append(topic)
    n_topics.append(len(set(ntopics)))

    
fig = make_subplots(rows=1, cols=2, horizontal_spacing=0.2)


fig.add_trace(go.Scatter(x=coherence_scores['Anzahl Topics'], y=coherence_scores['Coherence Score'], mode='lines',
                         name='Coherence Score',
                         line=dict(color=px.colors.qualitative.Antique[0])), row=1, col=1)


fig.add_trace(go.Scatter(x=list(range(50,101)), y=n_topics, mode='lines',
                         name='Anzahl eindeutiger Topics',
                         line=dict(color=px.colors.qualitative.Antique[1])), row=1, col=2)

fig.update_yaxes(title='Coherence Score', row=1, col=1)
fig.update_yaxes(title='Anzahl eindeutiger Topics', row=1, col=2)
fig.update_xaxes(title='Anzahl Topics', row=1, col=1)
fig.update_xaxes(title='Anzahl Topics', row=1, col=2)

fig.update_layout(font=dict(family='Computer Modern', color='black', size=15), template='simple_white')
fig.show()
In [7]:
# get best performing lda model
lda_model = model_list[47]

# Save model to disk.
temp_file = datapath('model')
lda_model.save(temp_file)
In [8]:
# print topics
for idx, topic in lda_model.print_topics(-1):
    print('Topic: {} \nWords: {}'.format(idx, topic))
Topic: 0 
Words: 0.158*"ehefüralle" + 0.096*"nrw" + 0.091*"stegner" + 0.059*"ltnrw" + 0.037*"lang" + 0.033*"sofort" + 0.031*"steigen" + 0.021*"schande" + 0.019*"diplomatisch" + 0.015*"gefährden"
Topic: 1 
Words: 0.042*"rufen" + 0.035*"eigentlich" + 0.032*"erzählen" + 0.031*"grüner" + 0.030*"ernsthaft" + 0.029*"anfangen" + 0.027*"kapitulieren" + 0.026*"staatstrojaner" + 0.025*"bundesrat" + 0.025*"alleine"
Topic: 2 
Words: 0.063*"krieg" + 0.049*"dresden" + 0.039*"frau" + 0.032*"martin" + 0.032*"verteidigen" + 0.031*"merkel" + 0.030*"islamistische" + 0.027*"dank" + 0.027*"fluchtursachen" + 0.025*"erste"
Topic: 3 
Words: 0.104*"überfällig" + 0.099*"fürsieda" + 0.085*"steineke" + 0.022*"neuruppin" + 0.008*"aliceweidellive" + 0.007*"vibb" + 0.004*"sebastian" + 0.001*"antwort" + 0.001*"btw" + 0.000*"fedidwgugl"
Topic: 4 
Words: 0.181*"brandenburg" + 0.135*"freund" + 0.014*"untersuchen" + 0.010*"juristisch" + 0.009*"fragselbst" + 0.008*"ohnehin" + 0.007*"wirrockendeutschland" + 0.007*"retweeten" + 0.004*"btw" + 0.003*"retweete"
Topic: 5 
Words: 0.166*"zdf" + 0.155*"gibt" + 0.102*"löschen" + 0.077*"facebook" + 0.062*"ard" + 0.040*"traudichdeutschland" + 0.035*"erhalten" + 0.032*"afd" + 0.029*"politische" + 0.025*"btw"
Topic: 6 
Words: 0.044*"wahlkampfauftakt" + 0.037*"düsseldorf" + 0.008*"ergänzen" + 0.007*"henkelsaal" + 0.003*"leser" + 0.003*"vertiefen" + 0.001*"bedrohung" + 0.001*"btw" + 0.000*"afd" + 0.000*"traudichdeutschland"
Topic: 7 
Words: 0.000*"btw" + 0.000*"afd" + 0.000*"traudichdeutschland" + 0.000*"teil" + 0.000*"kollaps" + 0.000*"zeit" + 0.000*"asylantragablehnung" + 0.000*"gauland" + 0.000*"hinterlassen" + 0.000*"tritt"
Topic: 8 
Words: 0.077*"gütersloh" + 0.051*"report" + 0.005*"daily" + 0.003*"bigdata" + 0.000*"fragen" + 0.000*"btw" + 0.000*"tag" + 0.000*"afd" + 0.000*"link" + 0.000*"cdu"
Topic: 9 
Words: 0.095*"uhr" + 0.067*"dienst" + 0.046*"katrin" + 0.028*"dirk" + 0.022*"ausgerechnet" + 0.013*"komm" + 0.010*"land" + 0.009*"heute" + 0.009*"hasstiraden" + 0.008*"abhalten"
Topic: 10 
Words: 0.061*"großartig" + 0.054*"mehrer" + 0.048*"meinfrankfurt" + 0.039*"begehen" + 0.032*"frankfurter" + 0.023*"fortschritt" + 0.017*"schwierig" + 0.016*"youtube" + 0.010*"spot" + 0.001*"views"
Topic: 11 
Words: 0.188*"liegen" + 0.043*"fall" + 0.037*"rechtswidrig" + 0.025*"rechtsgrundlage" + 0.016*"schweiz" + 0.013*"yougov" + 0.011*"grenzöffnung" + 0.008*"unklar" + 0.007*"bürger" + 0.007*"eckpfeiler"
Topic: 12 
Words: 0.112*"million" + 0.074*"brief" + 0.058*"gutes" + 0.040*"deutlich" + 0.031*"schicken" + 0.029*"wund" + 0.024*"drittstärkste" + 0.023*"kraft" + 0.020*"himmel" + 0.020*"juli"
Topic: 13 
Words: 0.047*"vorstellen" + 0.043*"kosten" + 0.040*"sache" + 0.038*"bringen" + 0.038*"kritisieren" + 0.034*"einwanderung" + 0.033*"lage" + 0.031*"mord" + 0.029*"illnerintensiv" + 0.028*"richtung"
Topic: 14 
Words: 0.123*"leeren" + 0.041*"tweet" + 0.037*"wofür" + 0.031*"wahlbetrug" + 0.029*"wahlbeobachter" + 0.020*"gähnende" + 0.014*"stehen" + 0.008*"zeigen" + 0.005*"schulz" + 0.005*"kollaps"
Topic: 15 
Words: 0.084*"bundessprecherin" + 0.078*"wahlaufruf" + 0.026*"traudichdeutschand" + 0.024*"einzug" + 0.010*"berg" + 0.009*"gebieten" + 0.007*"einhalt" + 0.007*"btoickv" + 0.006*"stephan" + 0.005*"wahlbeobachtung"
Topic: 16 
Words: 0.094*"russland" + 0.078*"usa" + 0.055*"syrien" + 0.053*"dieselgate" + 0.047*"bundeswehr" + 0.040*"abstimmung" + 0.036*"amp" + 0.031*"wachsen" + 0.025*"abzug" + 0.024*"kriegsgefahr"
Topic: 17 
Words: 0.091*"schauen" + 0.060*"sendung" + 0.007*"wehrpflicht" + 0.004*"tvduell" + 0.002*"wiedereinsetzung" + 0.001*"höchstwert" + 0.001*"traudichdeutschland" + 0.001*"merkel" + 0.001*"afd" + 0.001*"btw"
Topic: 18 
Words: 0.095*"nato" + 0.058*"autobahnprivatisierung" + 0.055*"csu" + 0.048*"erdogans" + 0.046*"präambel" + 0.046*"despotie" + 0.037*"skandalös" + 0.032*"cdu" + 0.031*"witz" + 0.027*"spd"
Topic: 19 
Words: 0.103*"bundesregierung" + 0.062*"grueneversenken" + 0.060*"offenbaren" + 0.044*"tolerant" + 0.032*"deutschland" + 0.032*"polizei" + 0.026*"nix" + 0.025*"nazi" + 0.024*"eben" + 0.024*"priorität"
Topic: 20 
Words: 0.182*"tun" + 0.090*"freitag" + 0.079*"lässt" + 0.078*"falsch" + 0.050*"gibts" + 0.030*"machen" + 0.027*"sommerinterview" + 0.027*"quote" + 0.017*"sagen" + 0.016*"sprache"
Topic: 21 
Words: 0.108*"denkenwirneu" + 0.099*"schlussrunde" + 0.075*"amtlich" + 0.054*"annewill" + 0.043*"fdp" + 0.033*"zukunftsthemen" + 0.032*"empfehlen" + 0.025*"führen" + 0.023*"chef" + 0.021*"geh"
Topic: 22 
Words: 0.089*"egal" + 0.078*"rechts" + 0.072*"name" + 0.071*"spannen" + 0.070*"weder" + 0.059*"wiederholen" + 0.058*"flüchtlingspolitik" + 0.035*"weitergehen" + 0.032*"holdirdeinlandzurück" + 0.030*"herzliche"
Topic: 23 
Words: 0.143*"trump" + 0.079*"türkei" + 0.058*"klaren" + 0.027*"diesel" + 0.026*"denken" + 0.024*"bleiben" + 0.023*"macht" + 0.023*"kind" + 0.022*"moderator" + 0.021*"art"
Topic: 24 
Words: 0.033*"armut" + 0.031*"prinzip" + 0.031*"richtig" + 0.027*"retten" + 0.024*"wissen" + 0.023*"heißen" + 0.023*"deutschland" + 0.021*"dobrindt" + 0.020*"bekämpfen" + 0.019*"mensch"
Topic: 25 
Words: 0.122*"schön" + 0.103*"plötzlich" + 0.082*"menschenrechte" + 0.073*"özdemir" + 0.029*"zusammenhalt" + 0.027*"wandel" + 0.012*"völkerrecht" + 0.011*"mut" + 0.011*"cemsession" + 0.011*"gegenwind"
Topic: 26 
Words: 0.123*"oppositionsführer" + 0.084*"zeitfürmartin" + 0.056*"langen" + 0.036*"öffnen" + 0.035*"wahllokale" + 0.031*"rentenkürzungen" + 0.021*"dennoch" + 0.018*"ziemlich" + 0.016*"love" + 0.015*"bein"
Topic: 27 
Words: 0.054*"europa" + 0.046*"peinlich" + 0.033*"welt" + 0.033*"euro" + 0.032*"präsentieren" + 0.029*"wahnsinn" + 0.028*"erneut" + 0.028*"sichern" + 0.027*"afd" + 0.026*"grenze"
Topic: 28 
Words: 0.084*"gauland" + 0.079*"alexander" + 0.044*"afd" + 0.037*"btw" + 0.037*"schnellen" + 0.036*"traudichdeutschland" + 0.033*"spitzenkandidaten" + 0.031*"geht" + 0.028*"wahlwerbespot" + 0.026*"umso"
Topic: 29 
Words: 0.000*"spdneindanke" + 0.000*"speiübel" + 0.000*"sozismüssenweg" + 0.000*"sozisversenken" + 0.000*"spaniel" + 0.000*"spanisch" + 0.000*"spazieren" + 0.000*"sozialromantische" + 0.000*"spielgeld" + 0.000*"spieltag"
Topic: 30 
Words: 0.135*"viel" + 0.050*"hartz" + 0.042*"hören" + 0.033*"medium" + 0.031*"sozial" + 0.028*"wahl" + 0.025*"leicht" + 0.025*"mut" + 0.020*"wieso" + 0.020*"bundestag"
Topic: 31 
Words: 0.038*"gar" + 0.029*"freuen" + 0.028*"traudichdeutschland" + 0.025*"afd" + 0.024*"korrekt" + 0.024*"flug" + 0.020*"karte" + 0.019*"partei" + 0.018*"rote" + 0.017*"ergebnis"
Topic: 32 
Words: 0.082*"waffe" + 0.068*"gabriel" + 0.062*"liefern" + 0.051*"bundeswehr" + 0.042*"warum" + 0.041*"sinn" + 0.039*"glücklich" + 0.036*"amp" + 0.029*"mehr" + 0.025*"bedenken"
Topic: 33 
Words: 0.144*"fedidwgugl" + 0.106*"politisch" + 0.058*"betreffen" + 0.037*"dank" + 0.035*"heute" + 0.035*"junge" + 0.034*"viel" + 0.032*"merkel" + 0.026*"veranstaltung" + 0.026*"schaffen"
Topic: 34 
Words: 0.397*"doppeln" + 0.122*"staatsbürgerschaft" + 0.005*"eva" + 0.004*"föcking" + 0.001*"landesumweltministerin" + 0.001*"schulze" + 0.000*"sein" + 0.000*"barcelona" + 0.000*"högl" + 0.000*"btw"
Topic: 35 
Words: 0.206*"statt" + 0.106*"finden" + 0.086*"handel" + 0.077*"groko" + 0.044*"bestimmen" + 0.031*"eidbrecherin" + 0.025*"anfang" + 0.023*"deutschland" + 0.022*"gerade" + 0.014*"btw"
Topic: 36 
Words: 0.111*"presse" + 0.067*"bild" + 0.050*"berechtigen" + 0.049*"lügen" + 0.014*"kochen" + 0.012*"justizminister" + 0.011*"tatort" + 0.004*"hamburg" + 0.003*"antwort" + 0.002*"herholen"
Topic: 37 
Words: 0.188*"noafd" + 0.062*"besonders" + 0.055*"bauen" + 0.054*"dielinke" + 0.049*"bundestagswahl" + 0.038*"vorsitzende" + 0.024*"weiterso" + 0.022*"wünsche" + 0.020*"tja" + 0.019*"landen"
Topic: 38 
Words: 0.089*"köln" + 0.087*"thema" + 0.086*"muslim" + 0.079*"terror" + 0.059*"oktoberfest" + 0.056*"merkelmussweg" + 0.049*"schon" + 0.038*"bundestag" + 0.037*"zensur" + 0.030*"freier"
Topic: 39 
Words: 0.200*"stets" + 0.063*"schule" + 0.045*"nerv" + 0.038*"erwarten" + 0.036*"schließlich" + 0.024*"demdeutschenvolke" + 0.013*"gründen" + 0.004*"laleh" + 0.004*"hadjimohamadvali" + 0.001*"abwehr"
Topic: 40 
Words: 0.119*"herr" + 0.106*"vergessen" + 0.100*"kritik" + 0.078*"meinungsfreiheit" + 0.054*"wirklich" + 0.046*"lieber" + 0.029*"traudichdeutschland" + 0.023*"verkaufen" + 0.023*"bürger" + 0.023*"brechen"
Topic: 41 
Words: 0.084*"wählen" + 0.079*"irrsinn" + 0.055*"traudichdeutschland" + 0.053*"btw" + 0.051*"retweete" + 0.045*"afd" + 0.043*"haben" + 0.031*"verfassung" + 0.028*"umgehen" + 0.027*"stimme"
Topic: 42 
Words: 0.415*"wirken" + 0.043*"unerträglich" + 0.034*"polit" + 0.009*"dokumentation" + 0.008*"vorfeld" + 0.007*"übereicht" + 0.007*"wahlkampfstörungen" + 0.005*"hauptbahnhof" + 0.002*"verfolgt" + 0.001*"traudichdeutschland"
Topic: 43 
Words: 0.066*"geld" + 0.055*"steuerzahler" + 0.048*"schäuble" + 0.042*"zusammen" + 0.038*"entlarven" + 0.037*"landtag" + 0.035*"ltnrw" + 0.028*"guten" + 0.026*"zeit" + 0.026*"morgen"
Topic: 44 
Words: 0.073*"gegner" + 0.061*"abschieben" + 0.031*"frankfurt" + 0.029*"merkel" + 0.028*"aufgabe" + 0.026*"recht" + 0.024*"bekommen" + 0.024*"lehnen" + 0.024*"hart" + 0.023*"deutsche"
Topic: 45 
Words: 0.133*"nonazis" + 0.088*"staat" + 0.075*"bald" + 0.072*"sehen" + 0.071*"nein" + 0.058*"verstehen" + 0.044*"heute" + 0.035*"btw" + 0.034*"anschlag" + 0.027*"solidarität"
Topic: 46 
Words: 0.150*"beschließen" + 0.089*"wow" + 0.088*"frei" + 0.079*"ehefueralle" + 0.075*"bundestag" + 0.056*"antrag" + 0.039*"rücken" + 0.037*"her" + 0.029*"kopf" + 0.022*"vonderleyen"
Topic: 47 
Words: 0.190*"the" + 0.129*"and" + 0.099*"winner" + 0.024*"duverdienstmehr" + 0.015*"hinterher" + 0.015*"solidarische" + 0.013*"linke" + 0.009*"wählen" + 0.005*"btw" + 0.005*"raute"
Topic: 48 
Words: 0.188*"ehefueralle" + 0.071*"arbeit" + 0.050*"netzdg" + 0.044*"nehmen" + 0.040*"leipzig" + 0.025*"ganz" + 0.024*"freuen" + 0.023*"hashtag" + 0.021*"ändern" + 0.020*"weit"
Topic: 49 
Words: 0.077*"wichtig" + 0.076*"kommentar" + 0.068*"opposition" + 0.055*"ehrlich" + 0.046*"platz" + 0.043*"namens" + 0.036*"laufen" + 0.030*"vielleicht" + 0.028*"linkebpt" + 0.028*"tvduell"
Topic: 50 
Words: 0.160*"regel" + 0.159*"linke" + 0.105*"asylpolitik" + 0.048*"endgültig" + 0.034*"leiden" + 0.028*"reaktion" + 0.022*"nötigen" + 0.018*"größenwahn" + 0.016*"kapitel" + 0.012*"strick"
Topic: 51 
Words: 0.000*"btw" + 0.000*"afd" + 0.000*"traudichdeutschland" + 0.000*"zeit" + 0.000*"sonntagsfrage" + 0.000*"fünfkampf" + 0.000*"feigenblatt" + 0.000*"bitte" + 0.000*"legen" + 0.000*"asylantrag"
Topic: 52 
Words: 0.100*"antifa" + 0.042*"verändern" + 0.037*"danken" + 0.036*"ehe" + 0.033*"deshalb" + 0.030*"nächst" + 0.027*"erfolg" + 0.027*"dramatisch" + 0.025*"kämpfen" + 0.025*"afdwählen"
Topic: 53 
Words: 0.066*"mehrheit" + 0.056*"unglaublich" + 0.042*"auftritt" + 0.035*"unterstützung" + 0.033*"deutsch" + 0.030*"freuen" + 0.030*"retweete" + 0.029*"zeigen" + 0.028*"afd" + 0.027*"traudichdeutschland"
Topic: 54 
Words: 0.041*"gerechtigkeit" + 0.040*"brauchen" + 0.035*"mensch" + 0.032*"nsu" + 0.032*"linke" + 0.032*"haus" + 0.032*"bleiben" + 0.025*"soziale" + 0.022*"partner" + 0.022*"klartext"
Topic: 55 
Words: 0.141*"schämen" + 0.097*"friedlich" + 0.058*"parteitag" + 0.049*"schmidt" + 0.013*"touché" + 0.008*"hamburg" + 0.006*"mdr" + 0.004*"färben" + 0.003*"veto" + 0.002*"sagen"
Topic: 56 
Words: 0.120*"petry" + 0.052*"frauke" + 0.022*"schicksahlswahl" + 0.009*"entsenden" + 0.006*"nonsens" + 0.003*"btw" + 0.001*"grüner" + 0.000*"afd" + 0.000*"traudichdeutschland" + 0.000*"sichern"
Topic: 57 
Words: 0.135*"modern" + 0.069*"esistzeit" + 0.065*"kanzler" + 0.050*"wut" + 0.039*"zeitfuermartin" + 0.039*"begeistern" + 0.038*"mutig" + 0.026*"kommt" + 0.023*"rechtfertigen" + 0.023*"dieselgipfel"
Topic: 58 
Words: 0.035*"intern" + 0.032*"kampagne" + 0.029*"reihe" + 0.024*"neugierig" + 0.024*"dritt" + 0.023*"komplette" + 0.021*"spannung" + 0.017*"feueralarm" + 0.016*"wahlen" + 0.010*"populisten"
Topic: 59 
Words: 0.051*"freiheit" + 0.046*"umwelt" + 0.046*"grün" + 0.043*"tiefpunkt" + 0.040*"grüne" + 0.036*"zukunftwirdausmutgemacht" + 0.030*"darumgrün" + 0.030*"gleichen" + 0.025*"kommen" + 0.021*"warnen"
Topic: 60 
Words: 0.139*"erdogan" + 0.064*"seehofer" + 0.056*"türkei" + 0.030*"obergrenze" + 0.029*"mögen" + 0.026*"csu" + 0.025*"demokratische" + 0.024*"idee" + 0.016*"unfassbar" + 0.015*"warum"
Topic: 61 
Words: 0.000*"btw" + 0.000*"afd" + 0.000*"teil" + 0.000*"traudichdeutschland" + 0.000*"zeit" + 0.000*"wählen" + 0.000*"videobotschaft" + 0.000*"sonntag" + 0.000*"wahlaufruf" + 0.000*"bundessprecherin"
Topic: 62 
Words: 0.078*"union" + 0.063*"mindestlohn" + 0.054*"ard" + 0.048*"zdf" + 0.046*"kämpfen" + 0.044*"platz" + 0.037*"abschiebung" + 0.033*"uhr" + 0.030*"wahl" + 0.027*"amp"
Topic: 63 
Words: 0.069*"wollen" + 0.059*"china" + 0.051*"lösen" + 0.046*"yeah" + 0.042*"terrorist" + 0.037*"zählen" + 0.034*"infostand" + 0.027*"anzeige" + 0.022*"nein" + 0.020*"jugend"
Topic: 64 
Words: 0.191*"aktuell" + 0.069*"linksextremisten" + 0.008*"anmelden" + 0.001*"afd" + 0.001*"neckarschiffahrt" + 0.001*"startpunkt" + 0.000*"btw" + 0.000*"heidelberg" + 0.000*"traudichdeutschland" + 0.000*"teil"
Topic: 65 
Words: 0.077*"stadt" + 0.049*"familiennachzug" + 0.037*"münchen" + 0.034*"tegel" + 0.034*"spitzenkandidatin" + 0.032*"weiß" + 0.025*"pflege" + 0.025*"grüner" + 0.023*"beim" + 0.022*"berlin"
Topic: 66 
Words: 0.166*"drücken" + 0.091*"berlin" + 0.084*"bereits" + 0.049*"stunde" + 0.042*"schöneberg" + 0.025*"pur" + 0.024*"mutlu" + 0.022*"tollen" + 0.019*"this" + 0.017*"gang"
Topic: 67 
Words: 0.112*"mitglied" + 0.065*"marx" + 0.049*"zurück" + 0.047*"schönes" + 0.042*"wahlboykott" + 0.032*"wagenknecht" + 0.025*"überraschung" + 0.022*"markt" + 0.022*"autoritär" + 0.021*"zitieren"
Topic: 68 
Words: 0.044*"diskussionskultur" + 0.032*"politisch" + 0.032*"ehefueralle" + 0.031*"lieben" + 0.028*"islamisierung" + 0.026*"gewalt" + 0.024*"überhaupt" + 0.022*"afd" + 0.021*"nennen" + 0.020*"stimmen"
Topic: 69 
Words: 0.155*"schreiben" + 0.070*"starten" + 0.055*"leiharbeit" + 0.054*"beschäftigen" + 0.043*"verschieden" + 0.040*"wär" + 0.035*"überlassen" + 0.031*"maßnahme" + 0.026*"befristung" + 0.019*"nutzen"
Topic: 70 
Words: 0.128*"maas" + 0.098*"netzdg" + 0.069*"gewinnen" + 0.051*"gerade" + 0.043*"leben" + 0.038*"gerne" + 0.025*"afd" + 0.022*"spd" + 0.021*"bitter" + 0.019*"genosse"
Topic: 71 
Words: 0.070*"obergrenze" + 0.039*"flüchtling" + 0.037*"gruene" + 0.033*"richten" + 0.030*"sachsen" + 0.030*"offen" + 0.029*"neue" + 0.025*"drehhofer" + 0.024*"linksextreme" + 0.023*"gefährder"
Topic: 72 
Words: 0.138*"stimmen" + 0.048*"einfach" + 0.044*"bund" + 0.044*"aussprechen" + 0.039*"txl" + 0.035*"rechtsausschuss" + 0.034*"union" + 0.031*"lächerlich" + 0.031*"vorschlag" + 0.023*"cdu"
Topic: 73 
Words: 0.038*"fakenews" + 0.031*"klimaschutz" + 0.025*"klimawandel" + 0.021*"altersarmut" + 0.016*"wirtschaft" + 0.015*"darumgrün" + 0.014*"echt" + 0.014*"afd" + 0.013*"mittel" + 0.013*"trump"
Topic: 74 
Words: 0.134*"wiegehtsd" + 0.081*"illner" + 0.057*"afrika" + 0.052*"migration" + 0.041*"folge" + 0.037*"diskussion" + 0.037*"aufgeben" + 0.036*"nachher" + 0.031*"ausmaß" + 0.030*"spaltung"
Topic: 75 
Words: 0.084*"inklusion" + 0.082*"unterwegs" + 0.047*"lammert" + 0.046*"viersen" + 0.030*"termin" + 0.027*"willich" + 0.024*"norbert" + 0.024*"erfahrung" + 0.013*"kreis" + 0.011*"solide"
Topic: 76 
Words: 0.049*"bildung" + 0.038*"klima" + 0.037*"zukunft" + 0.034*"digitalisierung" + 0.031*"integration" + 0.030*"europa" + 0.028*"debatte" + 0.024*"fahren" + 0.021*"durchsetzen" + 0.019*"deutschland"
Topic: 77 
Words: 0.078*"wann" + 0.076*"interessant" + 0.058*"fangen" + 0.057*"reiche" + 0.048*"einzig" + 0.046*"angesichts" + 0.045*"deutsch" + 0.044*"daher" + 0.041*"aufrüstung" + 0.029*"spät"
Topic: 78 
Words: 0.120*"eigen" + 0.047*"miete" + 0.046*"zahlen" + 0.035*"heutig" + 0.034*"gesetz" + 0.032*"koalition" + 0.026*"löhne" + 0.026*"nie" + 0.026*"rauf" + 0.025*"fehler"
Topic: 79 
Words: 0.053*"rein" + 0.031*"schaut" + 0.001*"axel" + 0.000*"btw" + 0.000*"darumgrün" + 0.000*"afd" + 0.000*"traudichdeutschland" + 0.000*"grün" + 0.000*"eckpfeiler" + 0.000*"fünfkampf"
Topic: 80 
Words: 0.093*"wahlarena" + 0.068*"konkret" + 0.065*"abschaffen" + 0.050*"völlig" + 0.044*"druck" + 0.043*"problem" + 0.036*"polizei" + 0.035*"luft" + 0.032*"netzdg" + 0.025*"hamburg"
Topic: 81 
Words: 0.191*"schröder" + 0.085*"spdbpt" + 0.070*"lindner" + 0.066*"stellen" + 0.060*"spd" + 0.050*"info" + 0.050*"überwachung" + 0.039*"weit" + 0.023*"mal" + 0.022*"klar"
Topic: 82 
Words: 0.048*"argument" + 0.045*"ghh" + 0.044*"verbrecher" + 0.029*"demokratie" + 0.026*"mietpreisbremse" + 0.025*"hamburg" + 0.021*"protest" + 0.020*"gham" + 0.017*"sitzen" + 0.016*"hören"
Topic: 83 
Words: 0.000*"bericht" + 0.000*"btw" + 0.000*"traudichdeutschland" + 0.000*"afd" + 0.000*"zeit" + 0.000*"afdwaehlen" + 0.000*"alexander" + 0.000*"gauland" + 0.000*"wählen" + 0.000*"teil"
Topic: 84 
Words: 0.233*"einschalten" + 0.089*"schnell" + 0.075*"aufs" + 0.061*"lasst" + 0.056*"toleranz" + 0.050*"unabhängig" + 0.028*"livestream" + 0.026*"vereinbarkeit" + 0.021*"btwahl" + 0.012*"arbeitsmarkt"
Topic: 85 
Words: 0.101*"sorgen" + 0.083*"mein" + 0.079*"neu" + 0.042*"letzt" + 0.035*"pflegenotstand" + 0.033*"entdecken" + 0.028*"fühlen" + 0.027*"willkommen" + 0.027*"ziel" + 0.027*"twitter"
Topic: 86 
Words: 0.153*"dienen" + 0.132*"haustür" + 0.075*"obwohl" + 0.025*"bundeskanzlerin" + 0.022*"nachbarschaft" + 0.021*"ärgern" + 0.014*"brunnenstraße" + 0.014*"daneben" + 0.013*"ludwigsburg" + 0.011*"angelamerkel"
Topic: 87 
Words: 0.000*"btw" + 0.000*"afd" + 0.000*"teil" + 0.000*"traudichdeutschland" + 0.000*"eckpfeiler" + 0.000*"zeit" + 0.000*"umfrage" + 0.000*"nunmehr" + 0.000*"programm" + 0.000*"sicherheit"
Topic: 88 
Words: 0.195*"dortmund" + 0.158*"massiv" + 0.048*"spandau" + 0.033*"ausbaden" + 0.031*"zeigen" + 0.031*"nation" + 0.024*"disqualifizieren" + 0.009*"ichwähleafd" + 0.007*"osteuropäer" + 0.002*"sollen"
Topic: 89 
Words: 0.184*"nahles" + 0.123*"angriff" + 0.087*"parlament" + 0.041*"wahlwerbung" + 0.014*"aserbaidschan" + 0.013*"lokal" + 0.012*"bestechen" + 0.011*"mdbs" + 0.011*"ausreisepflichtige" + 0.009*"mächtig"
Topic: 90 
Words: 0.123*"darüber" + 0.090*"schäuble" + 0.084*"gerechtigkeit" + 0.080*"wundern" + 0.068*"putin" + 0.049*"verabschieden" + 0.042*"vertagen" + 0.035*"machen" + 0.024*"kretschmann" + 0.019*"schaden"
Topic: 91 
Words: 0.121*"thüringen" + 0.071*"programm" + 0.037*"heiß" + 0.026*"insa" + 0.023*"aufbauen" + 0.022*"zustimmung" + 0.019*"traudichdeutschland" + 0.019*"afd" + 0.018*"sonntagsfrage" + 0.016*"ttip"
Topic: 92 
Words: 0.126*"hoffnung" + 0.079*"sensation" + 0.044*"schließung" + 0.043*"bericht" + 0.024*"heidelberg" + 0.023*"gutachten" + 0.021*"nacht" + 0.017*"alice" + 0.016*"gewalttätige" + 0.015*"jena"
Topic: 93 
Words: 0.135*"vermögensteuer" + 0.037*"pflegekräfte" + 0.032*"btwcountdown" + 0.029*"gesetzliche" + 0.026*"erinnern" + 0.013*"kneipenwahlkampf" + 0.007*"personalbemessung" + 0.005*"streiken" + 0.002*"link" + 0.000*"btw"
Topic: 94 
Words: 0.338*"teilnehmer" + 0.059*"wahlabend" + 0.046*"begrüßen" + 0.045*"genauso" + 0.024*"elefantenrunde" + 0.019*"naja" + 0.006*"toller" + 0.005*"sehe" + 0.003*"btw" + 0.002*"schnappschüsse"
Topic: 95 
Words: 0.109*"darstellen" + 0.103*"polizist" + 0.081*"ordentlich" + 0.031*"lohn" + 0.027*"ruck" + 0.027*"wäh" + 0.025*"dank" + 0.023*"mieter" + 0.012*"tvduell" + 0.010*"übersichtlich"
Topic: 96 
Words: 0.000*"btw" + 0.000*"afd" + 0.000*"traudichdeutschland" + 0.000*"zeit" + 0.000*"teil" + 0.000*"spd" + 0.000*"fragselbst" + 0.000*"fünfkampf" + 0.000*"sonntagsfrage" + 0.000*"amp"
In [9]:
# get words and scores and save
topic_df = get_topicwords_scores(lda_model)
topic_df.to_json('../../data/BTW17_Twitter/lda/topics.json')
In [10]:
# get tweet topics
output_df = get_tweet_topic(lda_model, df)

# save lda_tweets
output_df.to_json('../../data/BTW17_Twitter/lda/preprocessed_lda_tweets_topics.json')
In [11]:
output_df.head(3)
Out[11]:
created_at text user extended_tweet retweeted_status tags full_text full_text_processed tokens username topic topic_score
0 2017-08-02 RT @AfD_Bund: 6️⃣5️⃣.0️⃣0️⃣0️⃣ Follower auf #T... {'id': 738771661915344897, 'id_str': '73877166... 0 {'created_at': 'Wed Aug 02 21:28:47 +0000 2017... btw17 6️⃣5️⃣.0️⃣0️⃣0️⃣ Follower auf #Twitter!\nDie #... ️⃣️⃣.️⃣️⃣️⃣ Follower auf #Twitter!\nDie #AfD-P... [follower, twitter, finden, immer, mehr, anklang] AfD_HD 62 0.220584
1 2017-08-02 RT @FraukePetry: #OSZE nimmt Sorge der #AfD er... {'id': 855324133, 'id_str': '855324133', 'name... 0 {'created_at': 'Wed Aug 02 11:37:33 +0000 2017... btw17 #OSZE nimmt Sorge der #AfD ernst und schickt T... #OSZE nimmt Sorge der #AfD ernst und schickt T... [osze, nehmen, sorge, afd, ernst, schicken, te... 83Schildi 31 0.363188
2 2017-08-02 RT @AfD_Bund: 6️⃣5️⃣.0️⃣0️⃣0️⃣ Follower auf #T... {'id': 1305881724, 'id_str': '1305881724', 'na... 0 {'created_at': 'Wed Aug 02 21:28:47 +0000 2017... btw17 6️⃣5️⃣.0️⃣0️⃣0️⃣ Follower auf #Twitter!\nDie #... ️⃣️⃣.️⃣️⃣️⃣ Follower auf #Twitter!\nDie #AfD-P... [follower, twitter, finden, immer, mehr, anklang] helmut_hedrich 62 0.220584
In [12]:
# plot number of topics per hashtag
plot_df = output_df.groupby('tags', as_index=False)['topic'].nunique().sort_values(by='topic').reset_index()
plot_df.rename(columns={'tags':'Hashtag', 'topic':'Anzahl Topics'}, inplace=True)
fig = px.bar(plot_df, x='Anzahl Topics', y='Hashtag',
             template='simple_white', color_discrete_sequence=px.colors.qualitative.Antique,
             orientation='h')
fig.update_layout(font=dict(family='Computer Modern', color='black', size=15))
fig.show()
In [41]:
import pandas as pd
from tqdm.notebook import tqdm
import plotly.express as px
In [2]:
output_df = pd.read_json('../../data/BTW17_Twitter/lda/preprocessed_lda_tweets_topics.json')
topic_df = pd.read_json('../../data/BTW17_Twitter/lda/topics.json')
tmp_df = output_df[['tags', 'topic', 'topic_score']]
hashtags = tmp_df['tags'].unique().tolist()
In [33]:
topics = []

for i in tqdm(range(len(hashtags))):
    hashtag = hashtags[i]
    tmp = tmp_df[tmp_df['tags']==hashtag]
    topic_index = tmp.groupby('topic', as_index=False).sum('topic_score')['topic_score'].idxmax()
    topic = tmp.groupby('topic', as_index=False).sum('topic_score')['topic'][topic_index]
    topics.append(topic)
In [35]:
hashtag_topics = pd.DataFrame(data={'hashtag': hashtags, 'topic': topics})
hashtag_topics = hashtag_topics.merge(topic_df, on='topic')
# save to json
hashtag_topics.to_json('../../data/BTW17_Twitter/lda/hashtag_topics.json')
hashtag_topics.head(3)
Out[35]:
hashtag topic topic_words scores
0 btw17 60 [erdogan, seehofer, türkei, obergrenze, mögen,... [0.139, 0.064, 0.056, 0.030, 0.029, 0.026, 0.0...
1 traudichdeutschland 60 [erdogan, seehofer, türkei, obergrenze, mögen,... [0.139, 0.064, 0.056, 0.030, 0.029, 0.026, 0.0...
2 gauland 60 [erdogan, seehofer, türkei, obergrenze, mögen,... [0.139, 0.064, 0.056, 0.030, 0.029, 0.026, 0.0...
In [43]:
# plot number of topics per hashtag
plot_df = hashtag_topics.groupby('topic', as_index=False)['hashtag'].nunique().sort_values(by='topic').reset_index()
plot_df.rename(columns={'topic':'Topic', 'hashtag':'Anzahl Hashtags'}, inplace=True)
fig = px.bar(plot_df, x='Anzahl Hashtags', y='Topic',
             template='simple_white', color_discrete_sequence=px.colors.qualitative.Antique,
             orientation='h')
fig.update_layout(font=dict(family='Computer Modern', color='black', size=15))
fig.show()